//
//  ViewController.swift
//  懒加载
//
//  Created by YYY on 2017/7/21.
//  Copyright © 2017年 成品家（北京）网路科技有限公司. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    //定义变量只能用？ (只是定义，没有分配空间和初始化)
    //var label:  DemoLabel?
    
    //初始化并分配空间
    //var newLabel = DemoLabel()
    
    //private lazy var myLabel: DemoLabel = DemoLabel()
    //懒加载的代码只会在第一次调用的时候，执行闭包，然后将闭包的结果保存在label的属性中
    //一旦label被设置为nil，懒加载也不会再次执行
    //swift中一定不要主动清理视图或者控件，因为懒加载不回再次创建。
    private lazy var myLabel1: UILabel? = UILabel()
    
    //懒加载完整代码
    /*
    lazy var testLabel = { ()->DemoLabel in
        let l = DemoLabel()
        //设置l的属性
        return l
    }()
 */
    /*
     可选项：
     1:目的：解决有和无的问题
  
     2:定义变量只能用？，表示变量可以为nil，或者有一个值
     var label:  DemoLabel? 只是定义，没有分配空间和初始化
   
     3:解包
     强行解包：目的是参与计算，但是存在风险，最好需要判断是否为nil,可以用guard let或者if let
     可选解包：不能参与计算，主要用于调用方法，如果对象存在就调用方法，如果对象为nil就不调用
     
     4:类型转换
     as？ 前面的结果是可选的，if let 或者guard let一定用as？
     as！ 前面的结果一定有值
     as NSString -> String   NSArray -> []数组   NSDictionary -> []字典 （因为底层做了结构体和OC对象的桥接）
     
     什么时候需要类型转换？
     将父类转换为子类，因为子类的属性和方法比父类多。
     转换有风险，如果没有对应的属性和方法会崩溃
     */
    
    /*
     懒加载
     初始化并且分配空间 label，会提前创建
     移动端开发，延迟加载减少内存消耗
     懒加载---lazy
     1:能够延迟创建
     2:最大好处：解除解包的烦恼
     */
    
    /*
     {}包装代码
    （）执行代码
     日常开发：
     1:闭包中的智能提示不好
     2:闭包中如果出现self，需要注意循环引用
     */
    
    /*
    private func setUpUI()
    {
        label = DemoLabel()
        label?.center = view.center
        label?.textColor = UIColor.red
        label?.text = "124"
        label?.sizeToFit()
        view.addSubview(label!)
    }
    */
    /*
    private func setUpUI1()
    {
        newLabel.frame = CGRect(x: 100, y: 50, width: 100, height: 30)
        newLabel.textColor = #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)
        newLabel.text = "hello"
        view.addSubview(newLabel)

    }
    */
  
    /*
    private func setUpUI2()
    {
        myLabel.frame = CGRect(x: 10, y: 100, width: 100, height: 30)
        myLabel.textColor = #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)
        myLabel.text = "world"
        view.addSubview(myLabel)
        
    }
    */
    
    private func setUpUI3()
    {
        print(myLabel1)
        print("-----")
        myLabel1?.frame = CGRect(x: 10, y: 100, width: 100, height: 30)
        myLabel1?.textColor = #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)
        myLabel1?.text = "world"
        view.addSubview(myLabel1!)
        
        print(myLabel1)
        print("-----")
        
        myLabel1 = nil
        
        print(myLabel1)
        print("-----")
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        setUpUI3()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

